package com.zxjbyte.yiyi.module.upms.messaging.eventbus.listener;

import com.google.common.eventbus.Subscribe;
import com.zxjbyte.yiyi.framework.common.core.eventbus.EventSubscriber;
import com.zxjbyte.yiyi.module.upms.messaging.eventbus.event.UserEvent;
import com.zxjbyte.yiyi.module.upms.messaging.eventbus.handler.UserEventHandler;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Optional;

/**
 * 用户事件监听器（异步处理）
 *
 * @Author zhangxingjia
 * @Date 2025/1/21 14:48
 * @Version: 1.0
 */
@Slf4j
@Component
@RequiredArgsConstructor
@EventSubscriber(async = true)
public class UserEventListener {

    private final List<UserEventHandler> handlers;

    /**
     * @Subscribe 订阅者
     * 负责处理事件
     * 方法必须 public void，且只有一个参数（事件类型）
     * @param event 事件
     */
    @Subscribe
    public void handleUserEvent(UserEvent event) {
        try {
            Optional<UserEventHandler> handler = handlers.stream()
                    .filter(h -> h.canHandle(event.getEventType()))
                    .findFirst();
            if (handler.isPresent()) {
                handler.get().handle(event);
            } else {
                log.warn("没有找到适合的处理器来处理事件类型: {}", event.getEventType());
            }
        } catch (Exception e) {
            log.error("处理用户事件失败, 事件类型: {}, 用户ID: {}",
                    event.getEventType(), event.getUser().getId(), e);
        }
    }
}
